iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

前言:凌晨三點的夢魘

欸,各位,先問個靈魂拷問:你有沒有過這種時刻?
凌晨三點,Slack 叮叮咚咚響個不停,你眼睛還半瞇著,腦子裡只有一句話:「拜託,這次不是我炸的…」
結果一看監控,Node Exporter 告訴你——主機 CPU 拉滿、記憶體吃爆、硬碟 I/O 像你家巷口早餐店阿姨在甩鍋一樣瘋狂。

然後呢?
Node Exporter 就只會冷冷地丟給你一張「宿主機體檢報告」,像醫生丟給你一份化驗單,上面寫著「肝指數爆表」。
但到底是誰喝醉?誰偷喝酒?醫生不知道,反正不是他喝的。

這時候,你心裡的 OS 就是:

「幹,到底是哪個容器在吃我資源?站出來啊!」

這時候…輪到 cAdvisor 出場了。
他就像你宿舍裡的「偷喝飲料偵探」,專門幫你抓出哪個死小孩在偷吸你的珍奶。

第一章:為什麼需要 cAdvisor?

容器化之後,世界變得很神奇。
以前一台 VM 跑一個服務,誰吃爆資源,一目了然。
現在一台主機可能塞了 10 個、20 個 container,光憑 Node Exporter 你只知道「整間公司加班費超標」,但完全不知道「是誰狂打卡」。

比喻一下:

  • Node Exporter = 整棟辦公室的總電費
  • cAdvisor = 會告訴你「誰半夜在公司開冷氣打電動」

這就很重要,因為:

  • 你要抓出資源怪獸,不然其他 container 都被拖下水。
  • 老闆半夜問你「為什麼主機快炸」,你不能只回「啊就有人用啊」。
  • Debug 起來更快,不然你只能靠 docker stats 一直盯著數字,眼睛瞎掉。


第二章:它怎麼做到的 : cAdvisor 的黑魔法

那 cAdvisor 到底怎麼知道「哪個 container 在爆肝」?
其實它就是去翻一些系統內部的小帳本:

  • cgroups:Linux 的資源管理工具,負責記錄每個 process 的 CPU、Memory、I/O 等使用情況。
  • /proc /sysfs:像 Linux kernel 的小日記本,什麼都寫在這裡。
  • docker.sock:就是 Docker 的「小密道」,你問它「現在有誰在跑」,它就會老實交代。

然後 cAdvisor 幫你做幾件事:

  1. 掃描每個容器
  2. 記錄 CPU、記憶體、網路、硬碟 I/O
  3. 提供一個 Web UI(http://localhost:8080)可以即時看狀況
  4. 暴露 /metrics endpoint,讓 Prometheus 抓

欸,不過提醒你,它不是魔法師,資料都是即時抓的。要看歷史走勢,你得靠 Prometheus 幫你存一段時間(預設大概 15 天,可以自己調)。如果要更久,那就得開 remote write,把資料丟去 Thanos、VictoriaMetrics 之類的長期儲存系統。


第三章:召喚 cAdvisor

來,上程式碼(docker-compose.yml):

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.49.1
    ports:
      - "127.0.0.1:8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - monitor-net

這裡的重點:

  • docker.sock:讓 cAdvisor 知道有哪些容器在跑
  • /sys/proc:拿系統統計數據
  • 8080:它的 Web UI + Prometheus metrics 入口

第一次掛 / 的時候,我內心真的抖了一下。就像第一次打開室友的抽屜,看到奇怪的東西。幸好這裡是只讀 :ro,不然真的會變兇案現場。


第四章:UI 長什麼鬼樣

啟動後,打開 http://localhost:8080,你會看到:

  • 每個容器的 CPU 折線圖
  • 記憶體消耗曲線
  • Network 流量、Block I/O 監控

http://localhost:8080/metrics,會看到 Prometheus 指標:

container_cpu_usage_seconds_total{container="apiGateway"}  12345.6
container_memory_usage_bytes{container="noteserver"}  104857600
container_fs_usage_bytes{container="note-storage"}  209715200
container_network_receive_bytes_total{container="open-webui"}  987654

第一次看到這些指標,腦袋一定會想:「這啥鬼?」

但仔細想一下,它其實就是在爆料:

  • 誰在熬夜打遊戲(CPU 飆高)
  • 誰在吃零食(Memory 佔滿)
  • 誰在寫爆硬碟(I/O 衝高)
  • 誰在偷下載片(Network 爆量)

就跟看室友的購物紀錄一樣,有點赤裸,但超有效、刺激的。


第五章:搭配 Prometheus

監控要有歷史數據,不然你只能即時盯著,根本沒意義。
所以我們在 prometheus.yml 裡加:

scrape_configs:
  - job_name: 'app_metrics'
    static_configs:
      - targets:
          - 'cadvisor:8080'

這樣,Prometheus 就會自動收集所有容器的 metrics。然後你就能在 Grafana 上畫出:

  • 單個容器的 CPU 使用率曲線
  • 容器記憶體用量排名
  • 每個容器的網路吞吐量

有了這些圖表,你就能跟老闆說:「你看,不是我炸的,是那個容器自己吃爆的。」
然後老闆會回:「哦,那是你寫的吧?」
幹。


第六章:那些踩過,才知道的痛

  1. cAdvisor 不存歷史數據
  • 它只顯示當下,要存歷史一定要搭配 Prometheus。
  • 就像你女友只會告訴你「我現在很生氣」,但過去她到底氣過幾次,完全沒紀錄。
  1. 版本太舊會怪怪的
  • 有些指標會變動,老版本不一定支援。
  • 就像你爸還在用 Nokia 3310,你要跟他解釋 iPhone 的 App Store,他完全聽不懂。
  1. docker.sock 權限
  • 有些環境安全政策不允許你掛。
  • 沒這個,你就像失明,只能聽聲音猜誰在吃東西。
  1. 資源開銷
  • cAdvisor 本身也會吃資源(雖然不多)。
  • 就像你請了一個保全來抓小偷,但他自己也要吃便當。

第七章:實戰意義

有了 cAdvisor,你就能:

  • 快速定位資源怪獸
    → 主機 CPU 飆高?打開 dashboard,一秒看出是誰在吃 CPU
    → 就像抓到誰偷用你 Netflix 帳號。

  • 避免容器打架
    → 某個容器吃光 RAM,其他容器被迫 OOM?cAdvisor 會留下證據
    → 像是辦公室有個人狂開冷氣,結果整棟跳電。

  • 容量規劃
    → 長期觀察容器資源曲線,決定要不要加 host,或調整限額
    → 就像看體重曲線,知道自己是不是該戒手搖。


第八章:人生碎念(欸,離題了)

其實我覺得工程師的監控生活,跟感情生活有點像。
你以為穩定了,結果某一天突然炸掉。
你以為 CPU 飆高只是暫時的,結果它根本就是出軌的前兆。

cAdvisor 就像是那個會偷偷幫你查對象手機的人。
雖然有點侵犯隱私,但…嗯,至少能救命。


第九章:總結

所以,現在你的監控三件套:

  • 應用端的心跳魔法 : 服務自己發出「我還活著」的訊號
  • Node Exporter:看宿主機本身健康不健康
  • cAdvisor:拆解每個容器的「體檢數據」

👉 好啦,Day 26 到這邊。
cAdvisor 不是什麼炫技神器,但它就是那種「平常不會想起來,但一炸掉就發現:幹,沒它根本找不到兇手」的存在。
有點像家裡抽屜裡的保險套——你不會天天拿出來說嘴,但沒有它,代價很可怕。

欸,說到「外部威脅」…明天我們就來聊 黑箱偵測器 Blackbox Exporter。
因為內部健康檢查是一回事,外面的人能不能正常敲門又是另一回事。
畢竟 API 就像交友軟體,你自己覺得「我活得好好的啊」,但外面的人卻回:「靠,怎麼按都沒反應」。



上一篇
Day25|主機資源耗盡?Node Exporter 告訴你真相
下一篇
Day27|黑箱偵測器上線!Blackbox Exporter 一網打盡
系列文
論文流浪記:我與AI 探索工具、組合流程、挑戰完整平台33
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言